const { app, BrowserWindow, Notification, Menu, Tray, shell, ipcMain } = require('electron')
const path = require('path')
const { APP_DEBUG, TEMP_PATH, store, BASE_APP_URL } = require('./helper')
const log = require('./log')
const { initIPC } = require('./ipc')

const iconPath = path.join(app.getAppPath(), "www/icons/tray.png");

// 主窗口
const mainWindowOptions = {
    width: 500,
    height: 300,
    frame: true,
    show: false,
    resizable: false, // 静止窗口大小

    webPreferences: {
        // // 设置此项为false后，才可在渲染进程中使用 electron api
        // contextIsolation: true, // 启用上下文隔离
        // nodeIntegration: true, // 允许渲染进程使用 Node.js API
        // preload: path.join(__dirname, 'preload.js'),
        // allowRunningInsecureContent: true, // 允许不安全内容
        // webSecurity: false, // 禁用 Web 安全策略，允许加载本地资源

        preload: path.join(__dirname, 'preload.js'),
        contextIsolation: true
    },
    icon: iconPath
}

// 创建主窗口
function createMainWindow() {
    try {
        // 注册全局MAIN_WINDOW函数，解决循环依赖问题
        global.MAIN_WINDOW = new BrowserWindow(mainWindowOptions)
        // 加载主页面
        const indexHtml = BASE_APP_URL + '/index.html'

        // 加载主页面
        global.MAIN_WINDOW.loadURL(indexHtml)
        // 创建加载动画窗口
        global.LOADING_WINDOW = createLoadingWindow()
        // 创建打印窗口
        global.PRINT_WINDOW = createPrintWindow()
        // 监听主窗口加载完成事件
        global.MAIN_WINDOW.webContents.on('did-finish-load', () => {
            // 避免内存泄漏
            setTimeout(() => {
                try {
                    global.MAIN_WINDOW.show()
                    // 如果加载窗口未被销毁，则关闭
                    if (global.LOADING_WINDOW != null && !global.LOADING_WINDOW.isDestroyed()) {
                        console.log("loadingWindow:close");
                        global.LOADING_WINDOW.destroy()
                    }
                } catch (e) {
                    console.log("did-finish-load", e);
                }
            }, 500) // 添加短暂延迟，确保渲染完成
        })
        // 初始化IPC
        initIPC()


        ipcMain.on('createPrintWindow', () => {
            global.PRINT_WINDOW = createPrintWindow()
        })



        // 初始化托盘
        initTray()
        // 监听主窗口加载失败事件
        global.MAIN_WINDOW.webContents.on('did-fail-load', (event, errorCode, errorDescription) => {
            log('页面加载失败:' + errorDescription)
            showNotification('启动失败!', '无法连接到应用服务器-' + errorDescription)
            // 关闭主窗口
            appQuit()
        })

        // 调试工具
        if (APP_DEBUG) {
            global.MAIN_WINDOW.webContents.openDevTools()
        }


        // 监听主窗口关闭事件
        global.MAIN_WINDOW.on('close', (event) => {
            if (store.get('closeType') == 'tray') {
                // 最小化到托盘
                global.MAIN_WINDOW.hide();
                // 隐藏任务栏
                global.MAIN_WINDOW.setSkipTaskbar(true);
                // 阻止窗口关闭
                event.preventDefault();
            } else {
                appQuit()
            }
        })

        // 监听主窗口关闭事件
        global.MAIN_WINDOW.on('closed', () => {
            appQuit()
        })
    } catch (e) {
        log('创建主窗口失败！' + e)
        appQuit()
    }
    return global.MAIN_WINDOW;
}

const loadingWindowOptions = {
    width: 300,
    height: 300,
    frame: false,
    transparent: true,
    alwaysOnTop: true,
    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false,
    },
    icon: iconPath
}

// 创建加载动画窗口
const createLoadingWindow = () => {
    if (global.LOADING_WINDOW != null) {
        return
    }
    // 创建加载动画窗口
    global.LOADING_WINDOW = new BrowserWindow(loadingWindowOptions)
    const loadingHtml =  BASE_APP_URL + '/loading.html';
    // 加载过渡页面
    global.LOADING_WINDOW.loadURL(loadingHtml)
    // 将加载窗口置于屏幕中央
    global.LOADING_WINDOW.center()
    global.LOADING_WINDOW.webContents.on('did-finish-load', () => {
        console.log("loadingWindow:successfull");
    })

    // 调试工具
    if (APP_DEBUG) {
        global.LOADING_WINDOW.webContents.openDevTools()
    }
    // 监听加载窗口关闭事件，确保资源被正确释放
    global.LOADING_WINDOW.on('closed', () => {
        // 突出显示主窗口，确保资源被正确释放
        if (global.MAIN_WINDOW != null && !global.MAIN_WINDOW.isDestroyed()) {
            global.MAIN_WINDOW.focus()
        }
        global.LOADING_WINDOW = null  // 将窗口引用设置为null，避免访问已销毁的对象
    })
    return global.LOADING_WINDOW
}


// 打印窗口
const printWindowOptions = {
    show: false,
    width: 1366,
    height: 768,
    webPreferences: {
        contextIsolation: false,
        enableRemoteModule: true,
    },
    icon: iconPath
}

// 创建打印窗口
const createPrintWindow = () => {
    if (global.PRINT_WINDOW != null) {
        return
    }
    global.PRINT_WINDOW = new BrowserWindow(printWindowOptions)
    // 加载打印页面
    const htmlText = `
    <html>
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>打印窗口</title>
        </head>
        <body>
            <h1>打印窗口</h1>
        </body>
    </html>
    `
    global.PRINT_WINDOW.loadURL('data:text/html,' + encodeURIComponent(htmlText))
    // 监听打印窗口关闭事件，确保资源被正确释放
    global.PRINT_WINDOW.on('closed', () => {
        global.PRINT_WINDOW = null
    })

    return global.PRINT_WINDOW
}



// 打印日志窗口
const printLogWindowOptions = {
    width: 1366,
    height: 768,
    frame: true, // 显示边框
    show: true, // 显示窗口
    // 静止窗口大小
    resizable: false,
    webPreferences: {
        contextIsolation: true,  // 确保隔离上下文
        nodeIntegration: false,  // 渲染进程直接访问
        preload: path.join(__dirname, 'preload.js'),
    },
    icon: iconPath
}


// 创建加载动画窗口
const createPrintLogWindow = () => {
    if (global.PRINT_LOG_WINDOW != null) {
        global.PRINT_LOG_WINDOW.show()
        return
    }
    // 创建加载动画窗口
    global.PRINT_LOG_WINDOW = new BrowserWindow(printLogWindowOptions)
    const printLogHtml =BASE_APP_URL + '/printLog.html';
    // 加载过渡页面
    global.PRINT_LOG_WINDOW.loadURL(printLogHtml)
    // 将加载窗口置于屏幕中央
    global.PRINT_LOG_WINDOW.center()

    global.PRINT_LOG_WINDOW.webContents.on('did-finish-load', () => {
        console.log("printLogWindow:successfull");
        global.PRINT_LOG_WINDOW.show()
    })

    // 调试工具
    if (APP_DEBUG) {
        global.PRINT_LOG_WINDOW.webContents.openDevTools()
    }
    // 监听加载窗口关闭事件，确保资源被正确释放
    global.PRINT_LOG_WINDOW.on('closed', () => {
        global.PRINT_LOG_WINDOW = null  // 将窗口引用设置为null，避免访问已销毁的对象
    })

    return global.PRINT_LOG_WINDOW
}


const settingWindowOptions = {
    width: 800,
    height: 600,
    frame: true, // 显示边框
    show: true, // 显示窗口
    // 静止窗口大小
    resizable: false,
    autoHideMenuBar:false,
    webPreferences: {
        contextIsolation: true,  // 确保隔离上下文
        nodeIntegration: false,  // 渲染进程直接访问
        preload: path.join(__dirname, 'preload.js'),
    },
    icon: iconPath
}

// 设置窗口
const createSettingWindow = () => {

    if (global.SETTING_WINDOW != null) {
        return
    }

    global.SETTING_WINDOW = new BrowserWindow(settingWindowOptions)

    const settingHtmlPath = BASE_APP_URL + '/setting.html';
    global.SETTING_WINDOW.loadURL(settingHtmlPath)


    // 监听设置窗口加载完成事件
    global.SETTING_WINDOW.webContents.on('did-finish-load', () => {
        console.log("settingWindow:successfull");
        global.SETTING_WINDOW.show()
        // 调试工具
        if (APP_DEBUG) {
            global.SETTING_WINDOW.webContents.openDevTools()
        }
    })


    // 监听设置窗口关闭事件，确保资源被正确释放
    global.SETTING_WINDOW.on('closed', () => {
        global.SETTING_WINDOW = null  // 将窗口引用设置为null，避免访问已销毁的对象
    })

    return global.SETTING_WINDOW
}



// 显示通知
const showNotification = (title, body) => {
    new Notification({ title: title, body: body, icon: iconPath }).show()
}

// 退出应用
const appQuit = () => {
    log("==> yzh-print-cn 关闭 <==");
    // 移除循环依赖
    // stopTask()
    // 改为发送退出事件，由主进程处理
    if (global.stopTask && typeof global.stopTask === 'function') {
        global.stopTask();
    }

    // 释放主窗口
    if (global.MAIN_WINDOW != null && !global.MAIN_WINDOW.isDestroyed()) {
        global.MAIN_WINDOW.destroy()
    }
    // 释放加载窗口
    if (global.LOADING_WINDOW != null && !global.LOADING_WINDOW.isDestroyed()) {
        global.LOADING_WINDOW.destroy()
    }
    // 释放打印窗口
    if (global.PRINT_WINDOW != null && !global.PRINT_WINDOW.isDestroyed()) {
        global.PRINT_WINDOW.destroy()
    }
    // 释放打印日志窗口
    if (global.PRINT_LOG_WINDOW != null && !global.PRINT_LOG_WINDOW.isDestroyed()) {
        global.PRINT_LOG_WINDOW.destroy()
    }
    // 释放设置窗口
    if (global.SETTING_WINDOW != null && !global.SETTING_WINDOW.isDestroyed()) {
        global.SETTING_WINDOW.destroy()
    }


    // 释放托盘
    if (global.APP_TRAY != null) {
        global.APP_TRAY.destroy()
    }

    // 释放资源
    global.MAIN_WINDOW = null
    global.LOADING_WINDOW = null
    global.PRINT_WINDOW = null
    global.PRINT_LOG_WINDOW = null
    global.SETTING_WINDOW = null
    app.quit()
}





/**
 * @description: 初始化托盘
 * @return {Tray} APP_TRAY 托盘实例
 */
function initTray() {
    let trayPath = path.join(app.getAppPath(), "www/icons/tray.png");
    global.APP_TRAY = new Tray(trayPath);
    // 托盘提示标题
    global.APP_TRAY.setToolTip("云尚-打印");

    // 托盘菜单
    const trayMenuTemplate = [
        {
            label: "缓存文件",
            click: () => {
                shell.openPath(TEMP_PATH);
            }
        },
        {
            label: "打印记录",
            click: () => {
                global.PRINT_LOG_WINDOW = createPrintLogWindow();
            }
        },
        {
            label: "运行日志",
            click: () => {
                shell.openPath(store.get("logPath"));
            }
        },
        { type: 'separator' },
        {
            label: "更多",
            submenu: [
                {
                    label: "打开DevTools",
                    click: () => {
                        if (global.MAIN_WINDOW) {
                            console.log("打开DevTools");
                            global.MAIN_WINDOW.webContents.openDevTools();
                        }
                    }
                }
            ]

        },
        { type: 'separator' },
        {
            label: "设置",
            click: () => {
                if (global.SETTING_WINDOW == null) {
                    global.SETTING_WINDOW = createSettingWindow();
                }
                global.SETTING_WINDOW.show()
            }
        },
        { type: 'separator' },
        {
            label: "退出",
            click: () => {
                appQuit();
            },
        },
    ];

    global.APP_TRAY.setContextMenu(Menu.buildFromTemplate(trayMenuTemplate));

    // 监听点击事件
    global.APP_TRAY.on("click", function () {
        if (global.MAIN_WINDOW.isMinimized()) {
            // 将窗口从最小化状态恢复到以前的状态
            global.MAIN_WINDOW.restore();
            global.MAIN_WINDOW.setSkipTaskbar(false);
        }
        if (!global.MAIN_WINDOW.isVisible()) {
            // 主窗口关闭不会被销毁，只是隐藏，重新显示即可
            global.MAIN_WINDOW.show();
            global.MAIN_WINDOW.setSkipTaskbar(false);
        }
        if (!global.MAIN_WINDOW.isFocused()) {
            // 主窗口未聚焦，使其聚焦
            global.MAIN_WINDOW.focus();
        }
    });
    return global.APP_TRAY;
}


module.exports = {
    mainWindowOptions,
    loadingWindowOptions,
    printWindowOptions,
    printLogWindowOptions,
    createMainWindow,
    createLoadingWindow,
    createPrintWindow,
    createPrintLogWindow,
    appQuit,
    showNotification
}